/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package indexacion;

import auxiliares.Log;
import buscador.IBuscador;
import buscador.InfoPalabra;
import buscador.TokensString;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;

/**
 *
 * @author Pablo
 */
public class IndiceDoc implements Serializable {

    private HashMap<Integer, InfoDocumento> indiceDoc;
    private static final long serialVersionUID = 7526472295622776148L;

    public IndiceDoc() {
        this.indiceDoc = new HashMap<>();
    }

    public int getNumEntradas() {
        return this.indiceDoc.size();
    }

    protected void nuevoDoc(int idDoc, String nomfichero, int posDoc, String tituloDoc) {
        InfoDocumento entradaDoc = new InfoDocumento(nomfichero, posDoc, tituloDoc);
        indiceDoc.put(idDoc, entradaDoc);
    }

    public InfoDocumento getInfoDoc(int idDoc) {
        return indiceDoc.get(idDoc);
    }

    public String getResumen(String pbuscada, InfoPalabra palabra) throws IOException {
        InfoDocumento infodoc = indiceDoc.get(palabra.getIdDocumento());
        TokensString tokenizador = new TokensString();
        ArrayList<String> listaTokens = null;
        int contador = 1;
        int numTokensLinea = 0;
        String lineaLeida = "";

        BufferedReader lecturaStream = new BufferedReader(new FileReader(infodoc.getNomFichero()));
        while (contador < infodoc.getLineaDoc()) {
            lecturaStream.readLine();
            contador++;
        }
        while (numTokensLinea < palabra.getPosDocumento()) {
            listaTokens = tokenizador.getTokens(lecturaStream.readLine());
            numTokensLinea = numTokensLinea + listaTokens.size();
        }
        int i = numTokensLinea - listaTokens.size();
        for (int j = 0; j < listaTokens.size(); j++) {
            if (i + j + 1 == palabra.getPosDocumento()) {
                lineaLeida = lineaLeida + " <font color=\"brown\">" + listaTokens.get(j) + "</font>";
            } else {
                lineaLeida = lineaLeida + " " + listaTokens.get(j);
            }
        }

        return lineaLeida;
    }

    public void getTextoDocumento(int idDoc, PrintWriter escritor) throws IOException {
        InfoDocumento infodoc = indiceDoc.get(idDoc);
        int contador = 1;
        String linea = "nada";

        BufferedReader lecturaStream = new BufferedReader(new FileReader(infodoc.getNomFichero()));
        while (contador < infodoc.getLineaDoc()) {
            lecturaStream.readLine();
            contador++;
        }
        
        escritor.println("<html>");
        escritor.println("<head>");
        escritor.println("<title> DOCUMENTO "+ idDoc +"</title>");
        escritor.println("</head>");
        escritor.println("<body>");

        while (null !=(linea = lecturaStream.readLine())) {
            
            
            escritor.print("<br>");
            if (!linea.startsWith(".I")) {
                escritor.print(linea);
            } else {
                break;
            }
        }

        escritor.println("</body>");
        escritor.println("</html>");
    }

    public void almacenar() throws ExcepcionIndexacion {
        File ficheroDoc = new File(IBuscador.FICHERO_INDICEDOC);
        ObjectOutputStream oos;

        try {
            if (ficheroDoc.exists() && ficheroDoc.delete()) {
                // Si ya existe se crea otro
                oos = new ObjectOutputStream(new FileOutputStream(IBuscador.FICHERO_INDICEDOC, false));
                oos.writeObject(this);
                oos.close();  // Se cierra al terminar.
            } else {  // Si no existe, se crea con cabecera
                oos = new ObjectOutputStream(new FileOutputStream(IBuscador.FICHERO_INDICEDOC, false));
                oos.writeObject(this);
                oos.close();  // Se cierra al terminar.
            }
        } catch (IOException ex) {
            throw new ExcepcionIndexacion("Problema al intentar almacenar el fichero de indiceDoc");
        }
    }
}
